package ar.pegasus.clasificador.dao.imp;

import java.util.List;

import javax.ejb.Stateless;

import ar.pegasus.clasificador.dao.api.local.LocalidadDAOLocal;
import ar.pegasus.clasificador.entidades.Localidad;
import ar.pegasus.clasificador.entidades.wrappers.LocalidadWrapper;
import ar.pegasus.clasificador.excepciones.LocalidadMalFormadaException;
import ar.pegasus.framework.componentes.PException;
import ar.pegasus.framework.dao.api.impl.GenericDAO;

@Stateless
public class LocalidadDAO extends GenericDAO<Localidad, Integer> implements LocalidadDAOLocal {

	@Override
	public String buscarLocalidad(String nombreLocalidad, int idSeccion) throws PException,LocalidadMalFormadaException {
		@SuppressWarnings("unchecked")
		List<Localidad> localidades = getEntityManager().createQuery("FROM Localidad loc " +
																	 "WHERE loc.seccion.idSeccion = :idSeccion	" +
																	 "  AND loc.nombre = :nombreLocalidad " +
																	 "  AND loc.circuito is not null")
																	 .setParameter("idSeccion", idSeccion)
																	 .setParameter("nombreLocalidad", nombreLocalidad)
																	 .getResultList();
		if(localidades.isEmpty())
			throw new LocalidadMalFormadaException("Se encontró una localidad que no está bien construida o incompleta" + nombreLocalidad);
		
		return localidades.get(0).getCircuito();
	}

	/**
	 * requiere: un string, que es la localidad ingresada
	 * 
	 * @return un codigo de localidad
	 */
	@SuppressWarnings("unchecked")
	public List<Localidad> getLocalidades(int seccionId, String localidad_buscada) throws PException {
			String Sqlstatement = "SELECT localidad.nombre, " +
					              "       localidad.idLocalidad," +
					              "		  localidad.f_idSeccion," +
					              "		  localidad.circuito," +
					              "		  localidad.f_idLocalidadPrincipal " +
					              "  FROM localidad " +  
					              " WHERE localidad.f_idSeccion = :seccionId  " +
					              "   AND localidad.nombre =  :localidadBuscada " +
					              "UNION " +
					              "SELECT localidad.nombre," +
					              "       localidad.idLocalidad," +
					              "		  localidad.f_idSeccion," +
					              "		  localidad.circuito," +
					              "		  localidad.f_idLocalidadPrincipal " +					              
					              "  FROM localidad," +
					              "       sinonimo_local" +
					              " WHERE sinonimo_local.f_idLocalidad = localidad.idLocalidad " +
					              "   AND localidad.f_idSeccion = :seccionId " +
					              "   AND sinonimo_local.sinonimo = :localidadBuscada "   ;

			List<Localidad> localidadesEncontradas = getEntityManager().createNativeQuery(Sqlstatement,ar.pegasus.clasificador.entidades.Localidad.class)
																        .setParameter("seccionId", seccionId).setParameter("localidadBuscada", localidad_buscada)
																        .getResultList();

			return localidadesEncontradas;
	}

	@Override
	public Localidad getLocalidad(int seccionId, String andcond, String orcond)	throws PException {
		// select para existe_localidad
		String query = "SELECT seccion, codigo, nombre " +
				       "  FROM v_localidad " +
				       " WHERE ( v_localidad.seccion = " + seccionId + " )" + 
				       andcond + ")) " +
				       orcond + ")) " +
					   " UNION " +
						"SELECT seccion, codigo, nombre " +
						"  FROM v_localidad_sinonimo " +
						" WHERE ( v_localidad_sinonimo.seccion = '"+ seccionId + "' ) ";

		@SuppressWarnings("unchecked")
		List<LocalidadWrapper> localidades = getEntityManager().createNativeQuery(query,ar.pegasus.clasificador.entidades.wrappers.LocalidadWrapper.class)
															 .getResultList();
		if(localidades.isEmpty())
			return null;
		// si recuperamos los datos correctamente  podemos recuperar los datos de la primera localidad
		LocalidadWrapper wrapper = localidades.get(0);
		Localidad localidad = getById(wrapper.getCodigo());
		return localidad;
	}

}
